package inutan.game.business;

import inutan.data.Resource.Type;
import inutan.game.prop.*;
import org.ricks.common.lang.Assert;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

/**
 * 道具类型管理
 */
public class ItemTypeManager {

    public static Map<Integer, OperatePropInterface>operatePropInterfaceMap = new HashMap<>();

    static {
        ItemTypeEnum.values();
    }
     enum ItemTypeEnum {

        ITEM_TYPE_GOLD(Type.GOLD, new GoldOperate()),

        ITEM_TYPE_PAYDIAMOND(Type.PAYDIAMOND, new PayDiamondOperate()),

        ITEM_TYPE_FREEDIAMOND(Type.FREEDIAMOND, new FreeDiamondOperate()),

        ITEM_TYPE_EQUIP(Type.EQUIP, new EquipOperate()),

        ITEM_TYPE_CHARACTER(Type.CHARACTER, new CardOperate()),

        ITEM_TYPE_FORMULA(Type.FORMULA, new FormulaOperate()),

        ITEM_TYPE_FURNITURE(Type.FURNITURE, new FurnitureOperate()),

        ITEM_TYPE_SIMEXP(Type.SIMEXP, new SimExpOperate()),

        TEM_TYPE_ITEM(Type.ITEM, new ItemOperate()),

        ITEM_TYPE_SD(Type.SD, new SDOperate());

        private int itemType;
        private OperatePropInterface operatePropTask;


        ItemTypeEnum(int itemType, OperatePropInterface operatePropTask) {
            this.itemType = itemType;
            this.operatePropTask = operatePropTask;
            addOperatePropInterface(itemType, operatePropTask);
        }

        /**
         * 空间交换时间，道具操作很频繁。
         * <p>
         * 每次通过values()方法遍历查找，时间复杂度是O(n),而通过HashMap查找，时间复杂度是O(1)。
         * <p>
         * 虽说枚举的数量通常都不会很庞大，每次通过values()方法遍历查找速度也很快。
         * 用HashMap会多占用一点点内存，但是考虑到这一点内存能从时间复杂度是O(n)降到O(1)，这种惠而不费的事，还是可以花时间去优化代码的。
         *
         * @param itemType
         * @param operatePropTask
         */
        public static void addOperatePropInterface(int itemType, OperatePropInterface operatePropTask) {
            operatePropInterfaceMap.put(itemType, operatePropTask);
        }

     }

    public static OperatePropInterface getOperatePropTask(int itemType) {
        OperatePropInterface operatePropInterface = operatePropInterfaceMap.get(itemType);
        Assert.isNotNull(operatePropInterface, "玩家正在操作不存在的道具类型：" + itemType);
        return operatePropInterface;
    }


    public static void register(int itemType, OperatePropInterface operation) {
        operatePropInterfaceMap.put(itemType, operation);
    }

    public static OperatePropInterface getOperation(int itemType) {
        return Optional.ofNullable(operatePropInterfaceMap.get(itemType))
                .orElseThrow(() -> new IllegalArgumentException("未支持的道具类型: "+itemType));
    }
}
